# Datenbank-Migrationen (Alembic) — PflegeDoku Pro

Go-forward-Schema-Aenderungen fuer SQLite (Default) und PostgreSQL (Multi-User).
Loest das alte Muster "neues migrations/migrate_*.py + Aufruf in main.py" ab.

## Architektur (Fork B2)

- **Frisch-Installation:** `init_db()` (models/database.py) baut das komplette
  Schema per `Base.metadata.create_all()` und markiert die DB danach automatisch
  auf die neueste Revision (`alembic stamp head`, idempotent, ohne Migration).
  Gilt fuer SQLite UND PostgreSQL.
- **Bestehende Vor-Alembic-DB:** wird beim ersten Start ebenfalls auf head
  gestempelt (ihr Schema entspricht dem create_all-Stand).
- **Schema-Aenderung danach:** neue Alembic-Revision -> `alembic upgrade head`.
  Laeuft auf beiden Dialekten (SQLite via Batch/Table-Rebuild, PostgreSQL nativ).
- **Die DB-URL** kommt IMMER aus `models.database.get_db_url()` (env.py),
  d.h. aus `DatabaseConfig`/`~/PflegeDokuDaten/db_config.json` inkl. 0600-
  Passwort-Keyfile und `sslmode` (DiPS). alembic.ini enthaelt KEINE URL.

## Eine Schema-Aenderung durchfuehren

Alle Befehle aus dem Kern-Modulverzeichnis (dort liegt `alembic.ini`):

    cd "PflegeDoku Pro"

1. **Modell aendern** in `src/models/…`.
2. **Revision erzeugen:**

       venv/bin/python -m alembic revision --autogenerate -m "beschreibung"

3. **Generierte Revision PRUEFEN** (`src/db_migrations/versions/…`). Autogenerate
   ist nur ein Entwurf — besonders pruefen:
   - Custom-Typen (`EncryptedString`, `JSONEncodedDict`) werden per render_item
     als `sa.String(...)` gerendert (kein Import auf models.* noetig).
   - Partial-Indizes (z.B. `final_lnw`) muessen `sqlite_where=` UND
     `postgresql_where=` tragen.
   - Enum-Wertaenderungen auf PostgreSQL (native ENUM-Typen) ggf. von Hand.
   - Fuer SQLite ist Batch-Modus aktiv (`render_as_batch`) -> ALTER via
     Table-Rebuild.
4. **Auf beiden Dialekten testen** (Wegwerf-DBs, nie die echte Daten-DB):

       # SQLite
       HOME=/tmp/pdoku-test venv/bin/python -m alembic upgrade head
       # PostgreSQL: db_config.json (db_type=postgresql, sslmode=disable fuer
       # lokalen Test) + POSTGRES_PASSWORD setzen, dann dasselbe upgrade head.

5. **Revision committen** (die Datei unter `versions/`).

## Nuetzliche Befehle

    venv/bin/python -m alembic current      # aktueller Stand der DB
    venv/bin/python -m alembic heads        # neueste Revision(en)
    venv/bin/python -m alembic history      # Revisions-Kette
    venv/bin/python -m alembic upgrade head # auf neuesten Stand
    venv/bin/python -m alembic downgrade -1 # eine Revision zurueck

## Wichtig

- **Kein neues `migrations/migrate_*.py` + main.py mehr.** Der Ordner
  `src/migrations/` (66 Alt-Skripte) und die 6 Boot-Catch-up-Aufrufe in main.py
  bleiben nur fuer bestehende Vor-Alembic-SQLite-DBs; kuenftige Aenderungen
  laufen ausschliesslich ueber Alembic.
- **Upgrades laufen NICHT automatisch beim App-Start** — bewusst ein separater
  Admin-Schritt. `init_db()` stempelt nur, migriert nicht.
- **SQLite bleibt Default und unangetastet**, PostgreSQL wird nur per
  db_config.json zusaetzlich freigeschaltet.
